package br.com.werp.regras.rh.controle;

import br.com.werp.regras.geral.Auditoria;
import br.com.werp.regras.geral.FabricaSubSistema;
import br.com.werp.regras.geral.GerenciamentoPessoa;
import br.com.werp.regras.geral.helpers.CepHelper;
import br.com.werp.regras.geral.helpers.CidadeHelper;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.rh.FuncionarioFormVO;
import br.com.werp.regras.geral.vos.rh.FuncionarioVO;
import br.com.werp.regras.geral.vos.tabelas.Cidade;
import br.com.werp.regras.geral.vos.tabelas.Funcionario;
import br.com.werp.regras.rh.integracao.FabricaDAO;
import br.com.werp.regras.rh.integracao.FuncionarioDAO;

import java.util.List;


/**
 * @author Sobreira
 * Criado em 08/09/2005
 */
public class ControleFuncionario {
    public ControleFuncionario() {
        super();
    }

    public void persistirFuncionario(Object formVO, String usuario)
        throws Exception {
        FuncionarioVO funcionarioVO = new FuncionarioVO();
        Util.copiarVOStringTipo(formVO, funcionarioVO);

        GerenciamentoPessoa pessoa = FabricaSubSistema.getGerenciamentoPessoa();
        FuncionarioDAO funcionarioDAO = FabricaDAO.getFuncionarioDAO();
        Auditoria auditoria = FabricaSubSistema.getAuditoria();
        Object key = funcionarioDAO.iniciarTransacao();

        //TODO Implementar se a pessoa ja existir como pessoa fisica no sistema
        try {
            Funcionario funcionario = new Funcionario();
            Util.copiarVO(funcionarioVO, funcionario);

            if (funcionarioVO.getPess_id() != 0) {
                pessoa.atualizarPessoaFisica(funcionarioVO, key, usuario);
                funcionario.setFunc_id(funcionarioVO.getPess_id());
                funcionarioDAO.atualizarFuncionario(key, funcionario);
                auditoria.auditarRecurso(key, usuario, funcionario,
                    Auditoria.ALTERAR);
            } else {
                int pessId =
                    pessoa.inserirPessoaFisica(funcionarioVO, key, usuario);
                funcionario.setFunc_id(pessId);
                funcionarioDAO.inserirFuncionario(key, funcionario);
                auditoria.auditarRecurso(key, usuario, funcionario,
                    Auditoria.INCLUIR);
            }

            funcionarioDAO.concluirTransacao(key);
        } catch (Exception e) {
            funcionarioDAO.abortarTransacao(key);
            throw e;
        }
    }

    public List pesquisarFuncionarios(Object formVO) throws Exception {
        FuncionarioVO funcionarioVO = new FuncionarioVO();
        Util.copiarVOStringTipo(formVO, funcionarioVO);

        FuncionarioDAO funcionarioDAO = FabricaDAO.getFuncionarioDAO();

        return funcionarioDAO.pesquisarFuncionarios(funcionarioVO);
    }

    public void carregarFuncionarios(Object formVO) throws Exception {
        List funcionarios = pesquisarFuncionarios(formVO);
        FuncionarioVO funcionarioVO = (FuncionarioVO) funcionarios.get(0);
        Cidade cidade =
            CidadeHelper.obterCidade(String.valueOf(
                    funcionarioVO.getFisc_naturalidade()));
        FuncionarioFormVO funcionarioFormVO = new FuncionarioFormVO();
        Util.copiarVOTipoString(funcionarioVO, funcionarioFormVO);
        funcionarioFormVO.setFisc_naturalidade_label(cidade.getCida_descricao());
        Util.copiarVO(funcionarioFormVO, formVO);
    }
}
